import mongoose from 'mongoose';

/**
 * MongoDB连接配置
 * 优化并发性能和连接池管理
 */
export const connectMongoDB = async () => {
  try {
    const uri = process.env.MONGODB_URI || 'mongodb://localhost:27017/exercise';
    
    // 连接配置选项 - 优化并发性能
    const options = {
      // 连接池配置
      maxPoolSize: 50,          // 最大连接池大小（默认10，增加到50）
      minPoolSize: 5,           // 最小连接池大小
      maxIdleTimeMS: 30000,     // 连接空闲超时时间（30秒）
      
      // 服务器选择配置
      serverSelectionTimeoutMS: 5000,   // 服务器选择超时时间
      socketTimeoutMS: 45000,           // Socket超时时间
      heartbeatFrequencyMS: 10000,      // 心跳检测频率
      
      // 自动重连配置
      retryWrites: true,        // 启用重试写入
      w: 'majority' as const,   // 写关注级别
      
      // 压缩配置
      compressors: ['zlib' as 'zlib'],  // 启用压缩以减少网络开销
      
      // 连接事件监听
      // 这些不是连接选项，需要在连接后设置
    };

    console.log('正在连接MongoDB...');
    console.log(`连接池配置: 最大${options.maxPoolSize}个连接，最小${options.minPoolSize}个连接`);
    
    await mongoose.connect(uri, options);
    
    // 设置事件监听器
    mongoose.connection.on('connected', () => {
      console.log('✓ MongoDB连接成功');
    });
    
    mongoose.connection.on('error', (err) => {
      console.error('✗ MongoDB连接错误:', err);
    });
    
    mongoose.connection.on('disconnected', () => {
      console.warn('⚠ MongoDB连接断开');
    });
    
    // 监听连接池事件
    mongoose.connection.on('connectionPoolCreated', () => {
      console.log('🏊 MongoDB连接池已创建');
    });
    
    mongoose.connection.on('connectionPoolReady', () => {
      console.log('🚀 MongoDB连接池就绪');
    });
    
    mongoose.connection.on('connectionPoolCleared', () => {
      console.log('🧹 MongoDB连接池已清理');
    });
    
    // 优化查询性能
    mongoose.set('strictQuery', false);
    mongoose.set('bufferCommands', false);      // 禁用命令缓冲
    
    console.log('Connected to MongoDB');
    console.log(`数据库: ${mongoose.connection.name}`);
    console.log(`连接状态: ${mongoose.connection.readyState === 1 ? '已连接' : '未连接'}`);
    
  } catch (error) {
    console.error('Failed to connect to MongoDB', error);
    process.exit(1);
  }
};
    